<?php
class Transferencia{
	private $valor=0;
	private $receptor=null;
	private $id=null;
	private $modoDePagamento=null;
	private $cambio=0;
	private $quadro=null;
	private static $_instance;
	private $moedaEmissor=null;
	private $moedaReceptor=null;
	private $taxa=null;
	private $referencia=null;
	private $entidade=11401;
	private $transferenciaConcluida=false;
	public function getTransferenciaConcluida(){
		return $this->transferenciaConcluida;
	}
	function getTransferenciaId(){
		global $DbTuga;
		if(!is_null($this->id)){
			return $this->id;
		}
		/* inicio da transacao */
		$DbTuga->begin();
		$sql='select max(id) as id from site.transferencia;';
		$id=$DbTuga->getall($sql);
		$id=$id[0]->id;
		$sql='insert into site.transferencia(id,estado) values('.++$id.',-1);';
		$result=$DbTuga->query($sql);
		/* fim da transacao */
		if($result){
			$DbTuga->commit();
		}else{
			/* todo incluir um ficheiro de erros com os dados introduzidos nos formularios */
			$DbTuga->rollback();
		}

		$this->id=$id;
		return $this->id;
	}
	function getTaxa(){
		return $this->taxa;
	}
	function setTaxa($taxa){
		$this->taxa=$taxa;
	}
	function getMoedaEmissor($user){
		global $DbTuga;
		if($this->moedaEmissor==null){
			$sql='
				select pai_NombreMoneda from clientes
				join hd_paises on hd_paises.pai_CodElite =clientes.CliNacionalidad
				where clientes.CliNumero='.$user->getId().';';
			$result=$DbTuga->getall($sql);
			$this->moedaEmissor=$result[0]->pai_NombreMoneda;
		}
		return $this->moedaEmissor;
	}
	function getMoedaReceptor($user){
		global $DbTuga;
		if($this->moedaReceptor==null){
			$sql='
				select pai_NombreMoneda from beneficiarios
				join hd_paises on hd_paises.pai_CodElite =beneficiarios.BnfPais
				where beneficiarios.BnfNumero=1;';
			$result=$DbTuga->getall($sql);
			$this->moedaReceptor=$result[0]->pai_NombreMoneda;
		}
		return $this->moedaReceptor;
	}
	public static function getInstance(){
		if(!(self::$_instance instanceof self)){
			self::$_instance=new self();
		}
		return self::$_instance;
	}
// Do not allow an explicit call of the constructor: $v = new Singleton();
	final private function __construct(){

	}
// Do not allow the clone operation: $x = clone $v;
	final private function __clone(){

	}
	function getQuadro(){
		if(is_null($this->quadro)){
			$this->procuraTodasInformacoes();
		}
		return $this->quadro;
	}
	function getDestinatario(){
		return $this->receptor;
	}
	function setDestinatario($destinatario){
		if(count($this->receptor)>1){
			foreach($this->receptor as &$value){
				if($value[0]->BnfNumero == $destinatario){
					$this->receptor=$value[0];
					return $this->receptor;
				}
			}
		}
	}
	function calculaCambio($cidade=null,$prioridade=null,$modoDePagamento=null,$moeda=null){
		
		global $DbTuga;
		$sql='
			select
		  htr_ID,
		  htr_NombreTarifa         as tarifa,
		  htr_Tasa                 as taxa,
		  miso_Cod_Elite,
		  htr_MonPagoISO           as moeda,
		  CorrAlias,
		  CorrNumero,
		  tam_Type,
		  hd_modospago.mp_ModoPago as modosDePagamento,
		  ciudades.CiuCiudad       as cidade
		from hd_cambiosdia
		  join beneficiarios
			on beneficiarios.BnfPais = hd_cambiosdia.htr_Pais
		  join hd_monedasiso
			on hd_monedasiso.miso_ID = hd_cambiosdia.htr_MonPagoISO
		  join corresponsales
			on CorrNumero = htr_Corresponsal
		  join hd_tarifasorigem
			on Tarifa = htr_Tarifa
		  join tramoscorresponsal
			on tam_Corr = CorrNumero
		  join correspondente_cidade_modopago
			on (beneficiarios.BnfCiudad = correspondente_cidade_modopago.Cidade
				and correspondente_cidade_modopago.Correspondente = corresponsales.CorrNumero)
		  join hd_modospago
			on hd_modospago.mp_ID = correspondente_cidade_modopago.ModoPagamento
		  join ciudades
			on ciudades.CiuNumero = beneficiarios.BnfCiudad
		where beneficiarios.BnfNumero ='.$this->receptor->BnfNumero.'
			and htr_MCobro = 1
			and Origem = 880
			and (100 * htr_Tasa between htr_DDesde and htr_DHasta or htr_DHasta = 0 )
	';
		//echo $sql;
		//die($sql);
		
		if($modoDePagamento!=null){
			$sql=$sql.' and correspondente_cidade_modopago.modoPagamento='.$modoDePagamento;
		}
		if($prioridade!=null){
			$sql=$sql.' and htr_ID='.$prioridade;
		}
		if($cidade!=null){
			$sql=$sql.' and beneficiarios.BnfCiudad='.$cidade;
		}
		if($moeda!=null){
			$sql=$sql.' and hd_monedasiso.miso_Cod_elite='.$moeda;
		}
		$sql=$sql.' order by taxa desc;';
		//echo $sql.'<br />';
		$cambio=$DbTuga->getall($sql);
		$this->cambio=$cambio;
		return $cambio;
	}
	function getId(){
		return $this->id;
	}
	function getValor(){
		return $this->valor;
	}
	function setValor($valor){
		$this->valor=$valor;
	}
	function getModoDePagamento(){
		return $this->modoDePagamento;
	}
	function setModoDePagamento($modoDePagamento){
		$this->modoDePagamento=$modoDePagamento;
	}
	function setCambio($idCambio){
		if(count($this->cambio)>1) foreach($this->cambio as &$value){
				if($value->htr_ID==$idCambio){
					$this->cambio=$value;
					return;
				}
			}
	}
	function getCambio(){
		return $this->cambio->taxa;
	}
	function getReceptor(){
		return $this->receptor;
	}
	function getDestinatarios(){
		return $this->destinatarios;
	}
	private function procuraTodasInformacoes(){
		global $DbTuga;
		$sql='
		select ciudades.CiuCiudad as cidade,ciudades.CiuNumero as id from ciudades
		join hd_paises on hd_paises.pai_CodElite=ciudades.CiuPais
		join beneficiarios on beneficiarios.BnfPais=hd_paises.pai_CodElite
		where beneficiarios.BnfNumero= '.$this->receptor->BnfNumero;
		$cidades=$DbTuga->getall($sql);
		$sql='
		select hd_cambiosdia.htr_ID as id,hd_cambiosdia.htr_NombreTarifa as prioridade from hd_cambiosdia;';
		$prioridade=$DbTuga->getall($sql);
		$sql='
		select mp_ModoPago as modoDePagamento,mp_ID as id from hd_modospago;';
		$modoDePagamento=$DbTuga->getall($sql);
		$sql='select  hd_monedasiso.miso_Cod_elite as id, hd_cambiosdia.htr_NombreMPago as moeda from hd_cambiosdia
		join beneficiarios on beneficiarios.BnfPais=hd_cambiosdia.htr_Pais
		join hd_monedasiso on hd_monedasiso.miso_ID=hd_cambiosdia.htr_NombreMPago
		where beneficiarios.BnfNumero = '.$this->receptor->BnfNumero.' group by htr_NombreMPago;';
		$moeda=$DbTuga->getall($sql);
		$result['cidade']=$cidades;
		$result['prioridade']=$prioridade;
		$result['modoDePagamento']=$modoDePagamento;
		$result['moeda']=$moeda;
		$this->quadro=$result;
		return $this->quadro;
	}
	function procuraDestinatarios($user){
		global $DbTuga;
		$sql='
		select   clientes.*, beneficiarios.*,hf_systypes.stpName as parentesco
		from clientes
		join unionclientesbeneficiarios on unionclientesbeneficiarios.uniCliente=clientes.CliNumero
		join beneficiarios on beneficiarios.BnfNumero=unionclientesbeneficiarios.uniBeneficiario
		join hd_paises on clientes.clpais=hd_paises.pai_codelite
		join hd_monedasiso on hd_monedasiso.miso_id=hd_paises.pai_nombremoneda
		join officeschema.beneficiarioscuentas on officeschema.beneficiarioscuentas.cb_Beneficiario=officeschema.beneficiarios.BnfNumero
		join officeschema.hf_systypes on officeschema.hf_systypes.stpAreaID=unionclientesbeneficiarios.uniRelation
		where officeschema.hf_systypes.stpGroup=3
		and clientes.CliNumero='.$user->getId();
		$result=$DbTuga->getall($sql);
		$this->receptor=$this->transformaDestinatariosPorConta($result);
		return $this->receptor;
	}
	private function getNomePaisFromCodigo($codigo){
	}
	private function transformaDestinatariosPorConta($result){
		$tamanho=count($result);
		$destinatarios=array();

		if($tamanho>0){
			$contas=array();
			for($i=0,$nova=0; $i<$tamanho; $i++,$nova++){
				if($i==0){
					$destinatarios[$nova][0]=$result[$i];
				}else{
					$j=0;
					for(; $result[$i]->BnfNumero==$result[$i-1]->BnfNumero; $j++,$i++){
						$contas[$j]=$result[$i];
					}
					if(count($contas)==0){
						$destinatarios[$nova][0]=$result[$i];
					}else{
						$contas[$j+1]=$destinatarios[$nova-1][0];
						$destinatarios[$nova-1]=$contas;
						$destinatarios[$nova][0]=$result[$i];
					}
					$contas=array();
				}
			}
		}
		return $destinatarios;
	}
	function save($estado=0){

		global $DbTuga,$user;
		if($this->id!=null){
			$sql="
				update site.transferencia set
				valor=".$this->valor
				.',emissor='.$user->getId()
				.',receptor='.$this->receptor->BnfNumero
				.',modoDePagamento='.$this->modoDePagamento
				.',cambio='.$this->getCambio()
				.',tempo='.$DbTuga->check_input(date('Y-m-d H:i:s'))
				.',estado='.$estado
				.',valorAReceber='.($this->getCambio())*$this->valor
				.',taxa='.$this->getTaxa()
				.',moedaEmissor='.$DbTuga->check_input($this->moedaEmissor)
				.',moedaReceptor='.$DbTuga->check_input($this->moedaReceptor)
				.", referenciaMultibanco='".$this->referencia
				."' where id =".$this->id;
			//echo $sql.'<br />';
			if($DbTuga->query($sql)){
				/* Transferencia
				  Ao Terminar uma transferencia , o objecto que esxiste em sessão é destruido e criado um novo.
				  Pode-se fazer f5, que nã irá fazer a mesma transferencia outra vez */
				$_SESSION['transferencia']=array();
				$_SESSION['transferencia']=$transferencia=Transferencia::getInstance();
				$this->transferenciaConcluida=true;
				return true;
			}else{
				$this->transferenciaConcluida=false;
				return false;
			}
		}
	}
	function estadosDasTransferencias(){
		global $DbTuga,$user;
		$sql='
				select
			  referenciaMultibanco,
			  valor,
			  pai_NombreMoneda        as moeda,
			  beneficiarios.BnfNombre as receptor,
			  modoDePagamento,
			  cambio,
			  estado,
			  tempo,
			  valorAReceber
			from site.transferencia
			  join beneficiarios
				on beneficiarios.BnfNumero = site.transferencia.receptor
			  join clientes
				on site.transferencia.emissor = clientes.clinumero
			  join hd_paises
				on hd_paises.pai_CodElite = clientes.CliNacionalidad
			where site.transferencia.emissor = '.$user->getId().'
				order by site.transferencia.id desc;';
		//echo '<br />'.$sql.'<br />';
		$result=$DbTuga->getall($sql);
		return $result;
	}
	private function w($i){
		return (pow(10,$i-1)%97);
	}
	private function tamanho($numero_a_controlar){
		$i=0;
		while($numero_a_controlar!=0){
			$posicao=intval($numero_a_controlar%10);
			$numero_a_controlar=intval($numero_a_controlar/10);
			$i++;
		}
		return $i;
	}
	private function calculaW(){
		for($i=10; $i!=0; $i--){
			$w[$i]=$this->w($i);
		}
		return $w;
	}
	private function checkDigit($numero_a_controlar){
		if(is_int($numero_a_controlar)) if($numero_a_controlar<0) die('o numero não é positivo');
		$tamanho=0;
		$numero_vector=array();
		$w=$this->calculaW();
		$posicao=$this->tamanho($numero_a_controlar);
		$i=0;
		while($numero_a_controlar!=0){
			$digito=intval($numero_a_controlar%10);
			$numero_a_controlar=intval($numero_a_controlar/10);
			$numero_vector[10-$posicao+1+$i]=$digito;
			$i++;
		}
		$diferenca=10-count($numero_vector);
		if($diferenca!=0){
			for($i=1; $i<=$diferenca; $i++){
				$numero_vector[$i]=0;
			}
			$p=array();
			for($i=10; $i!=0; $i--){
				$p[$i]=$w[$i]*$numero_vector[$i];
			}
			$c=98-((array_sum($p))%97);
			return $c;
		}
	}
	private function geraReferencia(){
//$numero_a_controlar=12417178;
		$numero_a_controlar=$this->getTransferenciaId();
		$digitos=$this->checkDigit($numero_a_controlar);
		$referencia=($numero_a_controlar*100)+$digitos;
		return $referencia;
	}
	public function getReferencia(){
		if(is_null($this->referencia)){

			$this->referencia=str_pad($this->geraReferencia(),9,"0",STR_PAD_LEFT);
		}
		return $this->referencia;
	}
	public function getEntidade(){

		return $this->entidade;
	}
}
